package usesynchronized;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 74646
 * Date: 2022-05-08
 * Time: 8:37
 */

/**
 * synchronized 的本质操作是修改了 Object 对象中的“对象头”里面的一个标记
 * 当两个线程同时针对一个对象加锁就会产生竞争
 * 如果两个线程针对不同对象加锁就不会产生竞争
 */
class Counter2 {
    // 自增变量
    public int count;

    public void increase(){
        /**
         * 使用 synchronized 修饰代码块
         * 进入代码块就加锁，出来代码块就解锁
         * 针对代码块加锁需要手动指定锁对象(锁对象：针对哪个对象加锁)
         */
        synchronized (this){
            count++;
        }
    }
}

public class Demo2 {
    private static Counter2 counter = new Counter2();

    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                counter.increase();
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                counter.increase();
            }
        });
        t1.start();
        t2.start();

        /**
         * 因为 main 线程与 t1,t2 线程是并发执行的，会导致 t1,t2 线程还没执行完就执行下面的打印操作
         * 为了保证 t1,t2 线程都执行完了再打印 count，
         * 所以调用 join 方法，等待 t1,t2 线程都执行完了再打印
         */
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(counter.count);
    }
}

